package middlewares

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

type ResponseData struct {
	Code    int         `json:"code"`
	Message string      `json:"msg"`
	Data    interface{} `json:"data"`
}

func ErrorResponse(c *gin.Context, code int, msg string) {
	c.JSON(code, ResponseData{
		Code:    code,
		Message: msg,
		Data:    nil,
	})
}
func SuccessResponse(c *gin.Context, code int, data interface{}) {
	c.JSON(code, ResponseData{
		Code:    code,
		Message: "成功",
		Data:    data,
	})
}

func ResponseMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Next()
		// 检查是否在处理请求时发生了错误
		// 如果发生了错误，通过ErrorResponse函数创建一个错误响应，并返回给客户端
		fmt.Printf("c.Writer.Status(): %v\n", c.Writer.Status())
		if len(c.Errors) > 0 {
			if c.Writer.Status() == 200 {
				c.Status(http.StatusInternalServerError)
			}
			err := c.Errors.Last()
			ErrorResponse(c, c.Writer.Status(), err.Error())
			return
		}

		// 检查是否设置了响应状态码
		// 如果未设置响应状态码，默认将状态码设置为200（OK）
		if c.Writer.Status() == 0 {
			c.Status(http.StatusOK)
		}
		// 如果没有错误，则格式化响应
		// 检查是否设置了"response_data"键的值，如果有，则调用SuccessResponse函数创建一个成功响应，并返回给客户端
		if c.Writer.Status() >= http.StatusOK && c.Writer.Status() < http.StatusMultipleChoices {
			data, exists := c.Get("response_data")
			if exists {
				SuccessResponse(c, c.Writer.Status(), data)
				return
			}
		}
	}
}
